package com.ikun.kunpicturebackend.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

/**
 * Spring MVC Json 配置
 */
@JsonComponent
public class JsonConfig {

    /**
     * 添加 Long 转 json 精度丢失的配置
     */
    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        // 创建ObjectMapper实例，用于XML和JSON的序列化与反序列化
        // builder.createXmlMapper(false)表示不创建专门的XML映射器，使用通用映射器
        // build()方法完成最终的构建
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        // 创建SimpleModule模块，用于扩展或修改Jackson的默认序列化行为
        SimpleModule module = new SimpleModule();
        // 添加Long类型的序列化器，将其转换为字符串形式
        // 这样可以避免前端处理大数字时精度丢失的问题
        module.addSerializer(Long.class, ToStringSerializer.instance);
        // 添加基本类型long的序列化器，同样转换为字符串形式
        module.addSerializer(Long.TYPE, ToStringSerializer.instance);
        // 将配置好的模块注册到ObjectMapper中
        objectMapper.registerModule(module);
        // 返回配置完成的ObjectMapper实例
        return objectMapper;
    }
}
